package br.com.velp.sudecap.mb.usuario;

import br.com.velp.sudecap.comum.BaseController;
import br.com.velp.sudecap.entidade.DireitoSistema;
import br.com.velp.sudecap.entidade.DireitoUsuario;
import br.com.velp.sudecap.entidade.GrupoUsuario;
import br.com.velp.sudecap.entidade.Usuario;
import br.com.velp.sudecap.enumerator.PaginaEnum;
import br.com.velp.sudecap.service.DireitoUsuarioService;
import br.com.velp.sudecap.web.util.MensagemUtil;
import java.util.ArrayList;
import java.util.List;
import javax.faces.model.SelectItem;
import org.lindbergframework.spring.scope.AccessScoped;
import org.primefaces.model.DualListModel;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;

/**
 * <sumario>
 * <objetivo>"Rastreabilidade"</objetivo>
 * <autor>EDUARDO SANTOS DE OLIVEIRA</autor>
 * <versao>1.0.0.0</versao>
 * <data_criacao> 17.10.2012 </data_criacao>
 * <data_ultima_alteracao> N/A </data_ultima_alteracao>
 * <requisito_afetado> RF010.03 – Gerenciar Permissão de Usuários </requisito_afetado>
 * <descricao> Managead Bean responsável por gerenciar grupos e permissões de Usuários </descricao>
 * </sumario>
 */
@Controller("permissaoUsuario")
@AccessScoped
public class PermissaoUsuario extends BaseController {

    public static final Long serialVersionUID = 1L;
    
    private List<SelectItem> listaUsuarios;
    private List<DireitoUsuario> direitosUsuario;
    private List<GrupoUsuario> gruposUsuario;
    private List<GrupoUsuario> gruposUsuarioSelecionados;
    private List<DireitoSistema> direitosSistema;
    private List<DireitoSistema> direitosSistemaSelecionados;
    private List<Usuario> usuarios;
    private DualListModel<GrupoUsuario> dualListGruposUsuario;
    private DualListModel<DireitoSistema> dualListDireitosSistema;
    private Long idUsuarioSelecionado;
    
    @Autowired
    private DireitoUsuarioService direitoUsuarioService;

    public String setup() {

	this.listaUsuarios = obterSelectItemPopulado(this.direitoUsuarioService.recuperarTodosUsuarios(), "id", "login");
	this.direitosSistema = new ArrayList<DireitoSistema>();
	this.gruposUsuario = new ArrayList<GrupoUsuario>();
	this.usuarios = this.direitoUsuarioService.recuperarTodosUsuarios();
	this.direitosUsuario = new ArrayList<DireitoUsuario>();
	this.gruposUsuarioSelecionados = new ArrayList<GrupoUsuario>();
	this.direitosSistemaSelecionados = new ArrayList<DireitoSistema>();
	this.dualListDireitosSistema = new DualListModel<DireitoSistema>(this.direitosSistema, this.direitosSistemaSelecionados);
	this.dualListGruposUsuario = new DualListModel<GrupoUsuario>(this.gruposUsuario, this.gruposUsuarioSelecionados);
	this.direitosUsuario = null;
	this.idUsuarioSelecionado = null;

	return PaginaEnum.PERMISSAO_USUARIO.getValue();

    }

    public void recuperarDireitosUsuario() {

	recuperarValoresIniciais();
	recuperarGruposAndDireitosDoUsuario();
	
	this.dualListDireitosSistema = new DualListModel<DireitoSistema>(this.direitosSistema, direitosSistemaSelecionados);
	this.dualListGruposUsuario = new DualListModel<GrupoUsuario>(this.gruposUsuario, gruposUsuarioSelecionados);

    }
    
    private void recuperarGruposAndDireitosDoUsuario(){
	
	if (this.idUsuarioSelecionado != null) {
	    this.direitosUsuario = this.direitoUsuarioService.recuperarDireitosUsuario(new Usuario(this.idUsuarioSelecionado));
	    if (!this.direitosUsuario.isEmpty()) {
		for (DireitoUsuario direitoUsuario : this.direitosUsuario) {
		    if (direitoUsuario.getDireito() != null) {
			this.direitosSistema.remove(direitoUsuario.getDireito());
			this.direitosSistemaSelecionados.add(direitoUsuario.getDireito());
		    }
		    if (direitoUsuario.getGrupo() != null) {
			this.gruposUsuario.remove(direitoUsuario.getGrupo());
			this.gruposUsuarioSelecionados.add(direitoUsuario.getGrupo());
		    }
		}
	    }
	}	
	
    }

    private void recuperarValoresIniciais() {
	
	this.direitosUsuario = new ArrayList<DireitoUsuario>();
	this.direitosSistemaSelecionados.clear();
	this.gruposUsuarioSelecionados.clear();
	this.direitosSistema.clear();
	this.gruposUsuario.clear();
	this.direitosSistema.addAll(this.direitoUsuarioService.recuperarTodosDireitosSistema());
	this.gruposUsuario.addAll(this.direitoUsuarioService.recuperarTodosGrupos());
	
    }

    public String voltar() {

	return PaginaEnum.PAGINA_PRINCIPAL.getValue();

    }

    public String salvar() {
	
	if(this.idUsuarioSelecionado == null){
	    
	    MensagemUtil.exibirMensagemAlerta(MensagemUtil.getMensagem("permissaoUsuarioNenhumUsuarioSelecionado"));	    
	    
	} else {
	    
	    Usuario usuarioSelecionado = new Usuario(this.idUsuarioSelecionado);

	    this.direitoUsuarioService.salvarAtualizarDireitosUsuario(
		    this.dualListDireitosSistema.getSource(), this.dualListDireitosSistema.getTarget(),
		    this.dualListGruposUsuario.getSource(), this.dualListGruposUsuario.getTarget(),
		    usuarioSelecionado);

	    MensagemUtil.exibirMensagemInformacao(MensagemUtil.getMensagem("registro_salvo_sucesso"));
	    this.idUsuarioSelecionado = null;
	    
	}

	return null;

    }
    
    // <editor-fold desc="GETTERS AND SETTERS" defaultstate="collapsed">                
    public List<DireitoSistema> getDireitosSistema() {
	return direitosSistema;
    }

    public void setDireitosSistema(List<DireitoSistema> direitosSistema) {
	this.direitosSistema = direitosSistema;
    }

    public List<DireitoUsuario> getDireitosUsuario() {
	return direitosUsuario;
    }

    public void setDireitosUsuario(List<DireitoUsuario> direitosUsuario) {
	this.direitosUsuario = direitosUsuario;
    }

    public List<GrupoUsuario> getGruposUsuario() {
	return gruposUsuario;
    }

    public void setGruposUsuario(List<GrupoUsuario> gruposUsuario) {
	this.gruposUsuario = gruposUsuario;
    }

    public List<SelectItem> getListaUsuarios() {
	return listaUsuarios;
    }

    public void setListaUsuarios(List<SelectItem> listaUsuarios) {
	this.listaUsuarios = listaUsuarios;
    }

    public List<Usuario> getUsuarios() {
	return usuarios;
    }

    public void setUsuarios(List<Usuario> usuarios) {
	this.usuarios = usuarios;
    }

    public Long getIdUsuarioSelecionado() {
	return idUsuarioSelecionado;
    }

    public void setIdUsuarioSelecionado(Long idUsuarioSelecionado) {
	this.idUsuarioSelecionado = idUsuarioSelecionado;
    }

    public List<DireitoSistema> getDireitosSistemaSelecionados() {
	return direitosSistemaSelecionados;
    }

    public void setDireitosSistemaSelecionados(List<DireitoSistema> direitosSistemaSelecionados) {
	this.direitosSistemaSelecionados = direitosSistemaSelecionados;
    }

    public DualListModel<DireitoSistema> getDualListDireitosSistema() {
	return dualListDireitosSistema;
    }

    public void setDualListDireitosSistema(DualListModel<DireitoSistema> dualListDireitosSistema) {
	this.dualListDireitosSistema = dualListDireitosSistema;
    }

    public DualListModel<GrupoUsuario> getDualListGruposUsuario() {
	return dualListGruposUsuario;
    }

    public void setDualListGruposUsuario(DualListModel<GrupoUsuario> dualListGruposUsuario) {
	this.dualListGruposUsuario = dualListGruposUsuario;
    }

    public List<GrupoUsuario> getGruposUsuarioSelecionados() {
	return gruposUsuarioSelecionados;
    }

    public void setGruposUsuarioSelecionados(List<GrupoUsuario> gruposUsuarioSelecionados) {
	this.gruposUsuarioSelecionados = gruposUsuarioSelecionados;
    }
    // </editor-fold>   
    
}
